ํ์ด์ฌ ๊ฒฝ๊ณ ํ๋ ์์ํฌ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ์ธ์. ์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๋์ฑ ๊น๋ํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ํด ์ ๊ตํ ํํฐ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
ํ์ด์ฌ ๊ฒฝ๊ณ ํ๋ ์์ํฌ ๋ง์คํฐํ๊ธฐ: ์ฌ์ฉ์ ์ ์ ์นดํ ๊ณ ๋ฆฌ ๋ฐ ๊ณ ๊ธ ํํฐ๋ง
์ํํธ์จ์ด ๊ฐ๋ฐ ์ธ๊ณ์์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ๋๊ฐ์ด ๋ฐ์ํ๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ค ๋ฌธ์ ๋ ์ฆ์ ์คํ์ ์ค๋จํด์ผ ํ๋ ์น๋ช ์ ์ธ ์ค๋ฅ์ ๋๋ค. ์ด๋ฅผ ์์ธ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํ์ง๋ง ํ์ ์ง๋๋ ์ด๋ป์ต๋๊น? ์ ์ฌ์ ์ธ ๋ฌธ์ , ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ธฐ๋ฅ ๋๋ ์ง๊ธ ๋น์ฅ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์์ํค์ง ์์ง๋ง ๋์ค์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ฐจ์ ์ฑ ์ธ ์ฝ๋ ํจํด์ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ด ๊ฒฝ๊ณ ์ ์์ญ์ด๋ฉฐ, ํ์ด์ฌ์ ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ์ง๋ง ์ข ์ข ํ์ฉ๋์ง ์๋ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ง์ ๊ฐ๋ฐ์๊ฐ DeprecationWarning
์ ๋ณด๋ ๋ฐ ์ต์ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฑฐ๊ธฐ์ ๋ฉ์ถฅ๋๋ค. ์ค๋ฅ๊ฐ ๋ ๋๊น์ง ๋ฌด์ํ๊ฑฐ๋ ์์ ํ ์ต์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ฌ์ warnings
๋ชจ๋์ ๋ง์คํฐํ๋ฉด ์ด๋ฌํ ์๋ฆผ์ ๋ฐฐ๊ฒฝ ์์์์ ์ฝ๋ ํ์ง์ ํฅ์์ํค๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ฉฐ ์ฌ์ฉ์์๊ฒ ๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ์ปค๋ฎค๋์ผ์ด์
๋๊ตฌ๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ ๊ธฐ๋ณธ ์ฌํญ์ ๋์ด ์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ ๊ตํ ํํฐ๋ง์ ์ ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์๋ฆผ์ ์์ ํ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
์ต์ ์ํํธ์จ์ด์์ ๊ฒฝ๊ณ ์ ์ญํ
๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ์ดํด๋ณด๊ธฐ ์ ์ ๊ฒฝ๊ณ ์ ์ฒ ํ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฒฝ๊ณ ๋ ๊ฐ๋ฐ์(ํ์ด์ฌ ํต์ฌ ํ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์ ๋๋ ๊ทํ)๊ฐ ๋ค๋ฅธ ๊ฐ๋ฐ์(์ข ์ข ๋ฏธ๋ ๋ฒ์ ์ ์์ ๋๋ ์ฝ๋ ์ฌ์ฉ์)์๊ฒ ๋ณด๋ด๋ ๋ฉ์์ง์ ๋๋ค. "์ฃผ์: ์ด ์ฝ๋๋ ์๋ํ์ง๋ง ์์์ผ ํ ์ฌํญ์ด ์์ต๋๋ค."๋ผ๋ ๋นํ๊ดด์ ์ ํธ์ ๋๋ค.
๊ฒฝ๊ณ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ๋ชฉ์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ธฐ๋ฅ์ ๋ํ ์๋ฆผ: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ํจ์, ํด๋์ค ๋๋ ๋งค๊ฐ๋ณ์๊ฐ ํฅํ ๋ฒ์ ์์ ์ ๊ฑฐ๋ ๊ฒ์์ ๊ฒฝ๊ณ ํ์ฌ ์ฝ๋ ๋ง์ด๊ทธ๋ ์ด์ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
- ์ ์ฌ์ ์ธ ๋ฒ๊ทธ ๊ฐ์กฐ ํ์: ๊ธฐ์ ์ ์ผ๋ก ์ ํจํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์์ํ๋ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ ๋ชจํธํ ๊ตฌ๋ฌธ ๋๋ ์ฌ์ฉ ํจํด์ ๋ํ ์๋ฆผ์ ๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ ์ ํธ: ๋นํจ์จ์ ์ด๊ฑฐ๋ ํ์ฅ ๋ถ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์์์ ์ฌ์ฉ์์๊ฒ ์๋ฆฝ๋๋ค.
- ํฅํ ๋์ ๋ณ๊ฒฝ ๋ฐํ:
FutureWarning
์ ์ฌ์ฉํ์ฌ ํจ์์ ๋์ ๋๋ ๋ฐํ ๊ฐ์ด ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ๊ฒ์์ ์๋ฆฝ๋๋ค.
์์ธ์ ๋ฌ๋ฆฌ ๊ฒฝ๊ณ ๋ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก stderr
์ ์ถ๋ ฅ๋์ด ์์ฉ ํ๋ก๊ทธ๋จ์ด ๊ณ์ ์คํ๋ ์ ์์ต๋๋ค. ์ด ๊ตฌ๋ณ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ธฐ๋ฅ์ ์ค๋จํ์ง ์๊ณ ์ค์ํ์ง๋ง ์ค์ํ์ง ์์ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
ํ์ด์ฌ ๋ด์ฅ `warnings` ๋ชจ๋์ ๋ํ ์ ๋ฌธ
ํ์ด์ฌ ๊ฒฝ๊ณ ์์คํ
์ ํต์ฌ์ ๋ด์ฅ warnings
๋ชจ๋์
๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ๊ณ ์ ์ดํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋จํ ๊ฒฝ๊ณ ๋ฐํ
๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ warnings.warn()
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
import warnings
def old_function(x, y):
warnings.warn("old_function() is deprecated; use new_function() instead.", DeprecationWarning, stacklevel=2)
# ... function logic ...
return x + y
# Calling the function will print the warning to stderr
old_function(1, 2)
์ด ์์ ์์๋ ์ธ ๊ฐ์ง ์ฃผ์ ์ธ์๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
- ๋ฉ์์ง: ๊ฒฝ๊ณ ๋ฅผ ์ค๋ช ํ๋ ๋ช ํํ๊ณ ์ค๋ช ์ ์ธ ๋ฌธ์์ด์ ๋๋ค.
- ์นดํ
๊ณ ๋ฆฌ: ๊ธฐ๋ณธ
Warning
์์ธ์ ํ์ ํด๋์ค์ ๋๋ค. ๋์ค์ ์ดํด๋ณด๊ฒ ์ง๋ง ํํฐ๋ง์ ๋งค์ฐ ์ค์ํฉ๋๋ค.DeprecationWarning
์ ์ผ๋ฐ์ ์ธ ๋ด์ฅ ์ ํ์ ๋๋ค. stacklevel
: ์ด ์ค์ํ ๋งค๊ฐ๋ณ์๋ ๊ฒฝ๊ณ ๊ฐ ์ด๋์์ ๋ฐ์ํ๋์ง ์ ์ดํฉ๋๋ค.stacklevel=1
(๊ธฐ๋ณธ๊ฐ)์warnings.warn()
์ด ํธ์ถ๋ ์ค์ ๊ฐ๋ฆฌํต๋๋ค.stacklevel=2
๋ ํจ์๋ฅผ ํธ์ถํ ์ค์ ๊ฐ๋ฆฌํค๋ฉฐ, ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ํธ์ถ์ ์์ค๋ฅผ ์ฐพ์ผ๋ ค๋ ์ต์ข ์ฌ์ฉ์์๊ฒ ํจ์ฌ ๋ ์ ์ฉํฉ๋๋ค.
๋ด์ฅ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ
ํ์ด์ฌ์ ๋ด์ฅ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฝ๊ณ ๊ฐ ๋์ฑ ์๋ฏธ ์์ด์ง๋๋ค.
Warning
: ๋ชจ๋ ๊ฒฝ๊ณ ์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.UserWarning
: ์ฌ์ฉ์ ์ฝ๋๋ก ์์ฑ๋ ๊ฒฝ๊ณ ์ ๊ธฐ๋ณธ ์นดํ ๊ณ ๋ฆฌ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ์ ์ข์ต๋๋ค.DeprecationWarning
: ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ณ ์ ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ํ ๊ฒฝ๊ณ ์ ๋๋ค. (ํ์ด์ฌ 2.7 ๋ฐ 3.2๋ถํฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์จ๊ฒจ์ง).SyntaxWarning
: ๊ตฌ๋ฌธ ์ค๋ฅ๊ฐ ์๋ ์์ฌ์ค๋ฌ์ด ๊ตฌ๋ฌธ์ ๋ํ ๊ฒฝ๊ณ ์ ๋๋ค.RuntimeWarning
: ์์ฌ์ค๋ฌ์ด ๋ฐํ์ ๋์์ ๋ํ ๊ฒฝ๊ณ ์ ๋๋ค.FutureWarning
: ํฅํ ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ณ๊ฒฝ๋ ๊ธฐ๋ฅ์ ๋ํ ๊ฒฝ๊ณ ์ ๋๋ค.PendingDeprecationWarning
: ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ณ ํฅํ ๋ ์ด์ ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ์์๋์ง๋ง ์์ง ์ฌ์ฉ๋์ง ์์ ๊ธฐ๋ฅ์ ๋ํ ๊ฒฝ๊ณ ์ ๋๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก ์จ๊ฒจ์ง).BytesWarning
:bytes
๋ฐbytearray
์ ๋ํ ์์ , ํนํ ๋ฌธ์์ด๊ณผ ๋น๊ตํ ๋ ๊ด๋ จ๋ฉ๋๋ค.
์ผ๋ฐ ๊ฒฝ๊ณ ์ ํ๊ณ
UserWarning
๋ฐ DeprecationWarning
๊ณผ ๊ฐ์ ๋ด์ฅ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์์์ด์ง๋ง ๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ ๋๋ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋น ๋ฅด๊ฒ ๋ถ์ถฉ๋ถํด์ง๋๋ค. `DataWrangler`๋ผ๋ ์ธ๊ธฐ ์๋ ๋ฐ์ดํฐ ๊ณผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฑ์๋ผ๊ณ ์์ํด ๋ณด์ญ์์ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋๋ ทํ ์ด์ ๋ก ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํด์ผ ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํจ์ `process_data_v1`์ด `process_data_v2`๋ฅผ ์ํด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๋ํด ์ต์ ํ๋์ง ์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ํ์ผ์์ ํฅํ ๋ฆด๋ฆฌ์ค์์ ์ ํจํ์ง ์์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ DeprecationWarning
์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๋ ๊ฒฝ์ฐ์๋ UserWarning
์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ ์ด ๊ธฐ๋ฅ์ด ๋งค์ฐ ์ ํ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ธฐ๋ฅ์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
์ ์ ์ฉํ๊ณ ์ถ์ง๋ง ์ธ์
๋น ์ฑ๋ฅ ๊ฒฝ๊ณ ๋ฅผ ํ ๋ฒ๋ง ๋ณด๋ ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ผ๋ฐ ์นดํ
๊ณ ๋ฆฌ๋ง์ผ๋ก๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ชจ๋ UserWarning
์ ์นจ๋ฌต์ํค๊ฑฐ๋(์ค์ํ ์ฑ๋ฅ ํ์ ๋์นจ) ๊ฒฝ๊ณ ๋ก ๋์ณ๋์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์์ "๊ฒฝ๊ณ ํผ๋ก"๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๋๋ฌด ๋ง์ ๊ด๋ จ ์๋ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ฉด ์ค์ํ ๊ฒฝ๊ณ ๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๊ธฐ ์์ํฉ๋๋ค. ํด๊ฒฐ์ฑ ์ ์์ฒด ๋๋ฉ์ธ๋ณ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ ๋ง๋ค๊ธฐ: ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ํ ํต์ฌ
์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ผ์ธ ์ ๋๋ก ๊ฐ๋จํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก UserWarning
๋๋ ๊ธฐ๋ณธ Warning
์์ ์์๋๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
`DataWrangler` ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ํน์ ๊ฒฝ๊ณ ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
# In datawrangler/warnings.py
class DataWranglerWarning(UserWarning):
"""Base warning for the DataWrangler library."""
pass
class PerformanceWarning(DataWranglerWarning):
"""Warning for potential performance issues."""
pass
class APIDeprecationWarning(DeprecationWarning):
"""Warning for deprecated features in the DataWrangler API."""
# Inherit from DeprecationWarning to be consistent with Python's ecosystem
pass
class ConfigSyntaxWarning(DataWranglerWarning):
"""Warning for outdated configuration file syntax."""
pass
์ด ๊ฐ๋จํ ์ฝ๋๋ ์์ฒญ๋๊ฒ ๊ฐ๋ ฅํฉ๋๋ค. ๋ช ํํ๊ณ ๊ณ์ธต์ ์ด๋ฉฐ ์ค๋ช ์ ์ธ ๊ฒฝ๊ณ ์ธํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ ๋ ์ด๋ฌํ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# In datawrangler/processing.py
import warnings
from .warnings import PerformanceWarning, APIDeprecationWarning
def process_data_v1(data):
warnings.warn(
"`process_data_v1` is deprecated and will be removed in DataWrangler 2.0. Use `process_data_v2` instead.",
APIDeprecationWarning,
stacklevel=2
)
# ... logic ...
def analyze_data(df):
if len(df) > 1_000_000 and df.index.name is None:
warnings.warn(
"DataFrame has over 1M rows and no named index. This may lead to slow joins. Consider setting an index.",
PerformanceWarning,
stacklevel=2
)
# ... logic ...
APIDeprecationWarning
๋ฐ PerformanceWarning
์ ์ฌ์ฉํ์ฌ ํน์ ํํฐ๋ง ๊ฐ๋ฅํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฒฝ๊ณ ์ ํฌํจํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ํ
์คํ
์ค์ธ ์ฌ์ฉ์์๊ฒ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ธ๋ถ์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
ํํฐ๋ง์ ํ: ๊ฒฝ๊ณ ์ถ๋ ฅ ์ ์ด
ํน์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ด์ผ๊ธฐ์ ์ ๋ฐ์ ๋ถ๊ณผํฉ๋๋ค. ์ง์ ํ ํ์ ํํฐ๋ง์์ ๋น๋กฏ๋ฉ๋๋ค. warnings
๋ชจ๋์ ์ด๋ฅผ ์ํํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. warnings.simplefilter()
๋ฐ ๋ ๊ฐ๋ ฅํ warnings.filterwarnings()
์
๋๋ค.
ํํฐ๋ (action, message, category, module, lineno) ํํ๋ก ์ ์๋ฉ๋๋ค. ๊ฒฝ๊ณ ๋ ๋ชจ๋ ์์ฑ์ด ํํฐ์ ํด๋น ๊ฐ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ผ์นํฉ๋๋ค. ํํฐ์ ํ๋๊ฐ `0` ๋๋ `None`์ด๋ฉด ์์ผ๋์นด๋๋ก ์ฒ๋ฆฌ๋์ด ๋ชจ๋ ๊ฒ๊ณผ ์ผ์นํฉ๋๋ค.
ํํฐ๋ง ์์
`action` ๋ฌธ์์ด์ ๊ฒฝ๊ณ ๊ฐ ํํฐ์ ์ผ์นํ ๋ ๋ฐ์ํ๋ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค.
"default"
: ๋ฐํ๋ ๊ฐ ์์น์ ๋ํด ์ผ์นํ๋ ๊ฒฝ๊ณ ์ ์ฒซ ๋ฒ์งธ ๋ฐ์์ ์ธ์ํฉ๋๋ค."error"
: ์ผ์นํ๋ ๊ฒฝ๊ณ ๋ฅผ ์์ธ๋ก ๋ฐ๊ฟ๋๋ค. ์ด๊ฒ์ ํ ์คํ ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค!"ignore"
: ์ผ์นํ๋ ๊ฒฝ๊ณ ๋ฅผ ์ธ์ํ์ง ์์ต๋๋ค."always"
: ์ด์ ์ ๋ณธ ์ ์ด ์๋๋ผ๋ ์ผ์นํ๋ ๊ฒฝ๊ณ ๋ฅผ ํญ์ ์ธ์ํฉ๋๋ค."module"
: ๋ฐํ๋ ๊ฐ ๋ชจ๋์ ๋ํด ์ผ์นํ๋ ๊ฒฝ๊ณ ์ ์ฒซ ๋ฒ์งธ ๋ฐ์์ ์ธ์ํฉ๋๋ค."once"
: ์์น์ ๊ด๊ณ์์ด ์ผ์นํ๋ ๊ฒฝ๊ณ ์ ์ฒซ ๋ฒ์งธ ๋ฐ์๋ง ์ธ์ํฉ๋๋ค.
์ฝ๋์์ ํํฐ ์ ์ฉ
์ด์ `DataWrangler` ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋๋ฆฌ์ค 1: ํ ์คํ ์ค ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์์ ์ฌํญ ์ ์ฉ
CI/CD ํ์ดํ๋ผ์ธ ์ค์๋ ์ ์ฝ๋๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ํน์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
import warnings
from datawrangler.warnings import APIDeprecationWarning
# Treat only our library's deprecation warnings as errors
warnings.filterwarnings("error", category=APIDeprecationWarning)
# This will now raise an APIDeprecationWarning exception instead of just printing a message.
try:
from datawrangler.processing import process_data_v1
process_data_v1()
except APIDeprecationWarning:
print("Caught the expected deprecation error!")
์ด ํํฐ๋ NumPy ๋๋ Pandas์ ๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ `DeprecationWarning`์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ์ ๋ฐ๋์ ๋๋ค.
์๋๋ฆฌ์ค 2: ํ๋ก๋์ ์์ ์ฑ๋ฅ ๊ฒฝ๊ณ ์์๊ฑฐ
ํ๋ก๋์ ํ๊ฒฝ์์ ์ฑ๋ฅ ๊ฒฝ๊ณ ๋ ๋๋ฌด ๋ง์ ๋ก๊ทธ ์์์ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ํน๋ณํ ์์๊ฑฐํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
import warnings
from datawrangler.warnings import PerformanceWarning
# We've identified the performance issues and accept them for now
warnings.filterwarnings("ignore", category=PerformanceWarning)
# This call will now run silently with no output
from datawrangler.processing import analyze_data
analyze_data(large_dataframe)
์ ๊ท ํํ์์ ์ฌ์ฉํ ๊ณ ๊ธ ํํฐ๋ง
`filterwarnings()`์ `message` ๋ฐ `module` ์ธ์๋ ์ ๊ท ํํ์์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ธ๊ณผ์ ์ธ ํํฐ๋ง์ด ๊ฐ๋ฅํฉ๋๋ค.
์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์์ `old_param`์ด๋ผ๋ ํน์ ๋งค๊ฐ๋ณ์์ ๊ด๋ จ๋ ๋ชจ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์ญ์์ค.
import warnings
# Ignore any warning containing the phrase "old_param is deprecated"
warnings.filterwarnings("ignore", message=".*old_param is deprecated.*")
์ปจํ ์คํธ ๊ด๋ฆฌ์: `warnings.catch_warnings()`
์๋ฅผ ๋ค์ด ๋จ์ผ ํ ์คํธ ์ฌ๋ก ๋ด์์ ์ฝ๋์ ์์ ์น์ ์ ๋ํด์๋ง ํํฐ ๊ท์น์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ ์ญ ํํฐ๋ฅผ ์์ ํ๋ ๊ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ์ํํฉ๋๋ค. `warnings.catch_warnings()` ์ปจํ ์คํธ ๊ด๋ฆฌ์๋ ์๋ฒฝํ ์๋ฃจ์ ์ ๋๋ค. ํญ๋ชฉ์ ํ์ฌ ํํฐ ์ํ๋ฅผ ๊ธฐ๋กํ๊ณ ์ข ๋ฃ ์ ๋ณต์ํฉ๋๋ค.
import warnings
from datawrangler.processing import process_data_v1
from datawrangler.warnings import APIDeprecationWarning
print("--- Entering context manager ---")
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to be triggered
warnings.simplefilter("always")
# Call our deprecated function
process_data_v1()
# Verify that the correct warning was caught
assert len(w) == 1
assert issubclass(w[-1].category, APIDeprecationWarning)
assert "process_data_v1" in str(w[-1].message)
print("--- Exited context manager ---")
# Outside the context manager, the filters are back to their original state.
# This call will behave as it did before the 'with' block.
process_data_v1()
์ด ํจํด์ ์ ์ญ ๊ฒฝ๊ณ ๊ตฌ์ฑ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ํน์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๊ณ ์๋์ง ์ฃผ์ฅํ๋ ๊ฐ๋ ฅํ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์ํ ์๋๋ฆฌ์ค์ ๋ํ ์คํ ๊ฐ๋ฅํ ๋ชจ๋ฒ ์ฌ๋ก๋ก ์ง์์ ํตํฉํด ๋ณด๊ฒ ์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ ๊ฐ๋ฐ์์ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ๊ฒฝ๊ณ ์ ์: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๊ธฐ๋ณธ ๊ฒฝ๊ณ (์: `MyLibraryWarning(Warning)`)๋ฅผ ๋ง๋ค๊ณ ๋ค๋ฅธ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณ ๊ฒฝ๊ณ ๊ฐ ์ด๋ฅผ ์์ํ๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ํ๋์ ๊ท์น์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
- ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ : ์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ๋ฅผ ํ๋๋ง ๋ง๋ค์ง ๋ง์ญ์์ค. `PerformanceWarning`, `APIDeprecationWarning` ๋ฐ `ConfigWarning`๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ค๋ช ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.
- ๊ฒฝ๊ณ ๋ฌธ์ํ: ์ฌ์ฉ์๋ ๊ฒฝ๊ณ ๊ฐ ์กด์ฌํ๋์ง ์์์ผ ํํฐ๋งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ณต์ฉ API์ ์ผ๋ถ๋ก ๋ฌธ์ํํฉ๋๋ค.
- `stacklevel=2`(๋๋ ๋ ๋์) ์ฌ์ฉ: ๊ฒฝ๊ณ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ๊ฐ ์๋ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๋์ง ํ์ธํฉ๋๋ค. ๋ด๋ถ ํธ์ถ ์คํ์ด ๊น์ผ๋ฉด ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค.
- ๋ช ํํ๊ณ ์คํ ๊ฐ๋ฅํ ๋ฉ์์ง ์ ๊ณต: ์ข์ ๊ฒฝ๊ณ ๋ฉ์์ง๋ ๋ฌด์์ด ์๋ชป๋์๋์ง, ์ ๋ฌธ์ ๊ฐ ๋๋์ง, ์์ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. "ํจ์ X๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค." ๋์ "ํจ์ X๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ v3.0์์ ์ ๊ฑฐ๋ฉ๋๋ค. ๋์ ํจ์ Y๋ฅผ ์ฌ์ฉํ์ญ์์ค."๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์์ ๊ฒฝ์ฐ
- ํ๊ฒฝ๋ณ ํํฐ ๊ตฌ์ฑ:
- ๊ฐ๋ฐ: ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ํฌ์ฐฉํ๊ธฐ ์ํด ๋๋ถ๋ถ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค. ์ข์ ์์์ ์ `warnings.simplefilter('default')`์ ๋๋ค.
- ํ ์คํ : ์๊ฒฉํ๊ฒ ์ํํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ๊ณ ์ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ์ด์ ์ฌ์ฉ ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ(`warnings.filterwarnings('error', category=...)`)๋ก ๋ฐ๊ฟ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๊ท ๋ฐ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํ๋ก๋์ : ์ ํ์ ์ผ๋ก ์ํํฉ๋๋ค. ๋ก๊ทธ๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ ์ ์์ง๋ง ๋์ค์ ๊ฒํ ํ ์ ์๋๋ก ๋ก๊น ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๊ตฌ์ฑํ์ฌ ์บก์ฒํฉ๋๋ค.
- ํ ์คํธ์์ ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉ: ํญ์ `with warnings.catch_warnings():`๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์์ฉ ์์ด ๊ฒฝ๊ณ ๋์์ ํ ์คํธํฉ๋๋ค.
- ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ์ ์ญ์ ์ผ๋ก ๋ฌด์ํ์ง ๋ง์ญ์์ค: ์คํฌ๋ฆฝํธ ์๋จ์ `warnings.filterwarnings('ignore')`๋ฅผ ์ถ๊ฐํ์ฌ ์์์ ์์ ๊ณ ์ถ์ ์ ์์ง๋ง ์ด๋ ์ํํฉ๋๋ค. ์ข ์์ฑ์ ๋ณด์ ์ทจ์ฝ์ ๋๋ ์์ ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ค์ํ ์ ๋ณด๋ฅผ ๋์น๊ฒ ๋ฉ๋๋ค. ์ ํํ๊ฒ ํํฐ๋งํ์ญ์์ค.
์ฝ๋ ์ธ๋ถ์์ ๊ฒฝ๊ณ ์ ์ด
์ ์ค๊ณ๋ ๊ฒฝ๊ณ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ ํ ์ค์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ด์ ํ๊ณผ ์ต์ข ์ฌ์ฉ์์๊ฒ ํ์์ ์ ๋๋ค.
๋ช ๋ น์ค ํ๋๊ทธ: `-W`
`-W` ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๋ น์ค์์ ์ง์ ๊ฒฝ๊ณ ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ๊ตฌ๋ฌธ์ `-W action:message:category:module:lineno`์ ๋๋ค.
์๋ฅผ ๋ค์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ๋ชจ๋ `APIDeprecationWarning`์ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.
python -W error::datawrangler.warnings.APIDeprecationWarning my_app.py
ํน์ ๋ชจ๋์ ๋ชจ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.
python -W ignore:::annoying_module my_app.py
ํ๊ฒฝ ๋ณ์: `PYTHONWARNINGS`
`PYTHONWARNINGS` ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด๋ Docker์ ๊ฐ์ ์ปจํ ์ด๋ํ๋ ํ๊ฒฝ ๋๋ CI/CD ๊ตฌ์ฑ ํ์ผ์์ ํนํ ์ ์ฉํฉ๋๋ค.
# This is equivalent to the first -W example above
export PYTHONWARNINGS="error::datawrangler.warnings.APIDeprecationWarning"
python my_app.py
์ฌ๋ฌ ํํฐ๋ ์ผํ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ์์์์ ์ ํธ๋ก
ํ์ด์ฌ ๊ฒฝ๊ณ ํ๋ ์์ํฌ๋ ์ฝ์์ ๋ฉ์์ง๋ฅผ ์ธ์ํ๋ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ ๊ทธ ์ด์์ ๋๋ค. ์ฝ๋ ์์ฑ์์ ์ฝ๋ ์ฌ์ฉ์ ๊ฐ์ ํต์ ์ ์ํ ์ ๊ตํ ์์คํ ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ด์ฅ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋์ด ์ฌ์ฉ์ ์ ์ ์ค๋ช ์ ๊ฒฝ๊ณ ํด๋์ค๋ฅผ ์์ฉํจ์ผ๋ก์จ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ํ ํ์ํ ํํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ง๋ฅํ ํํฐ๋ง๊ณผ ๊ฒฐํฉ๋ ์ด ์์คํ ์ ํตํด ๊ฐ๋ฐ์, ํ ์คํฐ ๋ฐ ์ด์ ์์ง๋์ด๋ ํน์ ์ปจํ ์คํธ์ ๋ง๊ฒ ์ ํธ ๋ ์ก์๋น๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์์ ๊ฒฝ๊ณ ๋ ๋ ๋์ ์ฌ๋ก์ ๋ํ ์ง์นจ์ด ๋ฉ๋๋ค. ํ ์คํ ์์๋ ํ๊ท ๋ฐ ๊ธฐ์ ๋ถ์ฑ์ ๋ํ ์์ ๋ง์ด ๋ฉ๋๋ค. ํ๋ก๋์ ์์๋ ๊ด๋ จ ์๋ ์์์ ํ์๋ณด๋ค๋ ์คํ ๊ฐ๋ฅํ ์ ๋ณด์ ์ ๊ด๋ฆฌ๋ ์คํธ๋ฆผ์ด ๋ฉ๋๋ค.
๋ค์ ๋ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋น๋ํ ๋ ์ผ๋ฐ์ ์ธ `UserWarning`์ ๋ฐํํ์ง ๋ง์ญ์์ค. ์๊ฐ์ ๋ด์ด ์ฌ์ฉ์ ์ ์ ๊ฒฝ๊ณ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ ์ํ์ญ์์ค. ๋ฏธ๋์ ์์ , ๋๋ฃ ๋ฐ ์ฌ์ฉ์๋ ์ ์ฌ์ ์ธ ์์์ ๋ช ํํ๊ณ ๊ฐ์น ์๋ ์ ํธ๋ก ๋ณํํด ์ฃผ์ ๊ฒ์ ๊ฐ์ฌํ ๊ฒ์ ๋๋ค.